#include <iostream>
using namespace std;
#include "Task.hpp"
#include "BlockingQueue5-18.hpp"
#include <pthread.h>
#include <unistd.h>

void* consume(void*args)//消费者入口函数
{
    BlockQueue<Task>* bq=static_cast<BlockQueue<Task>*>(args);//安全类型转换
    while(true)//不停的消费
    {
    //消费数据
    //1.获取数据并消费 2. 处理消费后的数据结果
    Task task(bq->pop());
    task();
    cout<<"消费了一个任务数据： "<<task.getResult()<<" pthread id is :"<<pthread_self()<<endl;
   sleep(1);
    }
    return nullptr;
}
void* product(void* args)//生产者入口函数
{
    BlockQueue<Task>* bq=static_cast<BlockQueue<Task>*>(args);
    //生产数据
    //1.先获取数据 2.再把数据生产到队列里面
 
    int len=opers.size();
    while(true)
    {
           int data1=rand() %10 +1;//[1,10]
    int data2=rand() % 10;//[0,9]
        Task task(data1,data2,opers[rand()%len]);
        bq->push(task);
        cout<<"生产了一个任务数据："<<task.getTask()<<"pthread id is： "<<pthread_self()<<endl;
       sleep(1);
    }
    return nullptr;
}
int main()
{
    srand(time(nullptr));//种一个时间种子
    BlockQueue<Task>* BQ=new BlockQueue<Task>();//特定内存空间创建（交易场所）
    //线程的创建
    pthread_t c[3],p[5];
    for(int i=0;i<3;i++)
    {
    pthread_create(c+i,nullptr,consume,BQ);//消费者
    }
    for(int i=0;i<5;i++)
    {
    pthread_create(p+i,nullptr,product,BQ);//生产者
    }
    //线程等待
    for(int i=0;i<3;i++)
    {
    pthread_join(*(c+i),nullptr);//不关心退出状态
    }
    for(int i=0;i<5;i++)
    {
    pthread_join(*(p+i),nullptr);
    }
    delete BQ;//退出前释放new出来的空间
    return 0;
}